О создании сайта

Было интересно ознакомиться с вариантом создания сайта на WordPress используя связку Nginx + Apache.
Очень понравился сервис Яндекс.Облако. Пользоваться удобно. Техническая документация замечательная. Сайт www.estelefe.ru размещен в «облаке».
Итог ознакомления: www.estelefe.ru и заметка о создании сайта, которая, быть может, кому-то будет в помощь.

Создание сайта в ОС Ubuntu Server 20.04.
Установка и настройка программного обеспечения: Nginx + Apache, WordPress, PHP, MySQL.

Обновляем программное обеспечение:

sudo apt update && sudo apt upgrade

Устанавливаем PHP (с дополнительными модулями), СУБД MySQL, веб-сервер Apache 2, архиватор unzip:

sudo apt install php php-mysql php-cli php-curl php-fpm php-gd php-dom php-mbstring php-imagick php-zip 
sudo apt install mysql-server mysql-client 
sudo apt install apache2
sudo apt install unzip

Переходим к работе в интерфейс командной строки СУБД MySQL:

sudo mysql

Создаем базу данных «wp_site»:

CREATE DATABASE wp_site;

Создаем пользователя СУБД «admin_site» c паролем «qwerty»:

CREATE USER 'admin_site'@'localhost' IDENTIFIED BY 'qwerty';

Предоставляем все права пользователю «admin_wp_site» на базу данных «wp_site»:

GRANT ALL PRIVILEGES ON wp_site.* TO 'admin_site'@'localhost';

Выходим из интерфейса командной строки СУБД MySQL:

\q

Останавливаем работу веб-сервера Apache 2:

sudo systemctl stop apache2.service

Открываем в текстовом редакторе «nano» файл настройки прослушиваемых портов веб-сервера Apache 2:

sudo nano /etc/apache2/ports.conf

Изменяем строку Listen 80 на Listen 8080

После сохранения файла веб-сервер Apache 2 будет ожидать обращения на порту 8080.

Файл настройки прослушиваемых портов веб-сервера Apache 2 имеет вид:

Listen 8080

<IfModule ssl_module>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).

Копируем стандартный файл настройки сайта:

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/BACKUP_000-default.conf

Открываем в текстовом редакторе «nano» стандартный файл настройки сайта веб-сервера Apache 2:

sudo nano /etc/apache2/sites-available/000-default.conf

Изменяем строку VirtualHost *:80 на VirtualHost 127.0.0.1:8080

После сохранения файла сайт будет доступен по ip-адресу 127.0.0.1 на порту 8080 веб-сервера Apache 2.

Добавляем строку: SetEnvIf X-Forwarded-Proto https HTTPS=on

Файл настройки сайта веб-сервера Apache 2 имеет вид:

<VirtualHost 127.0.0.1:8080>

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

SetEnvIf X-Forwarded-Proto https HTTPS=on
</VirtualHost>

Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).

Открываем в текстовом редакторе «nano» файл настройки веб-сервера Apache 2:

sudo nano /etc/apache2/apache2.conf

В конец файла добавляем строку Protocols h2 h2c http/1.1

После сохранения файла веб-сервер Apache 2 будет поддерживать работу по протоколам http2, http/1.1.

Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).

Открываем в текстовом редакторе «nano» файл настройки модуля PHP (включение CGI):

sudo nano /etc/php/7.4/fpm/php.ini

Ищем в тексте файла строку:

;cgi.fix_pathinfo=1

Для поиска и перехода в текстовом редакторе «nano» можно воспользоваться комбинацией клавиш (Ctrl+Q) и ввести искомую строку.

Заменяем на строку:

cgi.fix_pathinfo=1

Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).

Перезапускаем работу модуля php7.4-fpm:

sudo systemctl restart php7.4-fpm

Устанавливаем модуль RPAF для веб-сервера Apache 2:

sudo apt install libapache2-mod-rpaf

Открываем в текстовом редакторе «nano» файл настройки модуля RPAF:

sudo nano /etc/apache2/mods-available/rpaf.conf

Добавляем строки:

RPAFproxy_ips 127.0.0.1:8080
RPAFheader X-Real-IP
RPAFheader X-Forwarded-For

Файл настройки модуля RPAF имеет вид:

<IfModule rpaf_module>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1 ::1
    RPAFproxy_ips 127.0.0.1:8080
    RPAFheader X-Real-IP
    RPAFheader X-Forwarded-For
</IfModule>

Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).

Включаем модуль RPAF:

sudo a2enmod rpaf

Настройка модулей php7.4, mpm_prefork, mpm_event, proxy_fcgi, setenvif, http2 веб-сервера Apache 2.

Отключаем модули: php7.4 и mpm_prefork:

sudo a2dismod php7.4 mpm_prefork

Включаем модули: mpm_event, proxy_fcgi, setenvif, http2:

sudo a2enmod mpm_event proxy_fcgi setenvif http2

Применяем настройку модуля php7.4-fpm:

sudo a2enconf php7.4-fpm

Возобновляем работу веб-сервера Apache 2:

sudo systemctl start apache2.service

Устанавливаем веб-сервер Nginx:

sudo apt install nginx

Копируем стандартный файл настройки сайта веб-сервера Nginx:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/BACKUP_default

Редактируем файл настройки сайта веб-сервера Nginx в текстовом редакторе «nano»:

sudo nano /etc/nginx/sites-available/default

Ищем в тексте файла строку:

index index.html index.htm index.nginx-debian.html;

Добавляем под нее следующие строки:

location ~ /\. {
    deny all;
    }

Ищем в тексте файла строку:

server_name _;

Заменяем её на строку:

server_name site.local www.site.local;

Ищем в тексте файла строку:

location / {

Добавляем под нее следующие строки:

#Перенаправление обращений к веб-серверу Apache 2
proxy_connect_timeout 1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080;

Файл настройки сайта веб-сервера Nginx имеет вид:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    location ~ /\. {
    deny all;
    }

    server_name site.local www.site.local;

    location / {
     try_files $uri $uri/ =404;
     #Перенаправление обращений к веб-серверу Apache 2
     proxy_connect_timeout 1;
     proxy_set_header Host $http_host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Forwarded-Host $http_host;
     proxy_set_header X-Forwarded-Proto $scheme;
     proxy_pass http://127.0.0.1:8080;
     }
}

Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).

Удаляем файл index.html:

sudo rm /var/www/html/index.html

Скачиваем архив с файлами CMS WordPress (версия 5.4.2-ru_RU):

sudo wget https://ru.wordpress.org/wordpress-5.4.2-ru_RU.zip

Распаковываем архив с файлами CMS WordPress

sudo unzip wordpress-5.4.2-ru_RU.zip

Копируем файлы CMS WordPress в директорию для сайта:

sudo cp -r wordpress/* /var/www/html

Открываем в текстовом редакторе «nano» файл настройки CMS WordPress:

sudo nano /var/www/html/wp-config-sample.php

В строках содержащих DB_NAME, DB_USER, DB_PASSWORD указываем значения, которые задали при создании пользователя и базы данных в СУБД MySQL:

/** Имя базы данных для WordPress */
define( 'DB_NAME', 'wp_site' );

/** Имя пользователя MySQL */
define( 'DB_USER', 'admin_site' );

/** Пароль к базе данных MySQL */
define( 'DB_PASSWORD', 'qwerty' );

Завершаем работу в текстовом редакторе «nano» (Ctrl+X); сохраняем изменения в файле (Y).

Копируем файл настройки CMS WordPress:

sudo cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php

Удаляем пример файла настройки:

sudo rm /var/www/html/wp-config-sample.php

Назначаем владельцем директорий и файлов сайта пользователя «www-data» (системную учетную запись веб-сервера):

sudo find /var/www/html/ -type d -exec chown www-data {} \;
sudo find /var/www/html/ -type f -exec chown www-data {} \;

Возобновляем работу веб-сервера Nginx

sudo systemctl start nginx

Открываем в веб-браузере URL, где в место ip-адреса 192.168.1.111 укажите ip-адрес вашего сервера:

http://192.168.1.111/index.php

Создаем учетную запись администратора сайта.

Осуществляем вход под созданной учетной записью.

Готово. Сайт работает.

После регистрации доменного имени имеет смысл установка сертификата для сайта.
Если будете регистрировать доменное имя для вашего сайта на reg.ru, вероятно, будет предоставлен SSL-сертификат начального уровня доверия.
О том, как настроить SSL-сертификат на Nginx можно узнать из соответствующей статьи на сайте регистратора:

https://www.reg.ru/support/ssl-sertifikaty/ustanovka-ssl-sertifikata/ustanovka-ssl-sertifikata-na-nginx

После регистрации доменного имени и получения сертификата, можете воспользоваться конфигурацией для Nginx представленной ниже.

Создаем директорию для файлов сертификата:

sudo mkdir /SSL

После размещения в данной директории файлов сертификата создаем dhparam.pem файл:

sudo openssl dhparam -out /SSL/dhparam.pem 4096

Вариант файла настройки сайта для Nginx следующий:

#HTTP/1.1. Ожидание подключений на порту 80
server {
charset utf-8;
server_name site.ru www.site.ru;
listen *:80;

#Перенаправление на 443 порт (HTTPS) c возвратом кода состояния 301
  return 301 https://$server_name$request_uri;
}

#HTTP/2. SSL. Ожидание подключений на порту 443
  server {
  charset utf-8;
  server_name site.local www.site.local;
  listen *:443 ssl http2;
      #путь к файлу сертификата
      ssl_certificate /SSL/site.ru.crt;
      #путь к файлу ключа сертификата
      ssl_certificate_key /SSL/site.ru.key;
      #путь к файлу dhparam.pem 
      ssl_dhparam /SSL/dhparam.pem;
      #срок истечения сессии
      ssl_session_timeout 1h;
      #размер памяти, выделяемой для хранения кеша
      ssl_session_cache shared:SSL:15m;
      #разрешения только для TLS
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2;
      #установка строго соблюдения заданных ограничений
      ssl_prefer_server_ciphers on;
      #указывает браузерам помнить данные требования безопасности для домена один год
      add_header Strict-Transport-Security "max-age=31536000";

#Продолжительность соединения
  keepalive_timeout 1;
  reset_timedout_connection on;

#Путь к корневой директории файлов сайта
  root /var/www/html;

#Приоритет чтения файлов сайта
  index index.php index.html;

#Запрет получения скрытых файлов (например к .htaccess и .htpassword)
  location ~ /\. {
  deny all;
}

#Перенаправление обращений к веб-серверу Apache 2
  location / {
  proxy_connect_timeout 1;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $http_host;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_pass http://127.0.0.1:8080;
  }
}

Альтернативный вариант установки сертификата для сайта — Certbot — бесплатный программный инструмент с открытым исходным кодом для автоматического использования сертификатов Let’s Encrypt.
Инструкция: https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx

Проверка подключения репозитария:

sudo apt-get install software-properties-common
sudo add-apt-repository universe

Установка Certbot для Nginx:

sudo apt-get install certbot python3-certbot-nginx

Получение, установка и обслуживание сертификата в автоматическом режиме:

sudo certbot --nginx

Всего Вам хорошего.

Публикации на тему:
https://github.com/ksemaev
https://community.vscale.io/hc/ru/community/posts/208808369-Настройка-Nginx-в-качестве-обратного-прокси-к-Apache
https://community.vscale.io/hc/ru/community/posts/208340569-Как-установить-и-настроить-LEMP-Linux-Nginx-MySQL-PHP-на-сервере-с-Ubuntu-16-04
https://www.digitalocean.com/community/questions/nginx-as-reverse-proxy-for-apache-too-many-redirects
https://habr.com/ru/post/351402/

Ссылки на ресурсы:
Техническая документация Яндекс.Облако — https://cloud.yandex.ru/docs
Яндекс.Облако — https://cloud.yandex.ru/
Яндекс.Вебмастер — https://webmaster.yandex.ru/
REG.RU — https://www.reg.ru/
Nginx — https://www.nginx.com/
Apache — https://www.apache.org/
WordPress — https://ru.wordpress.org/
PHP — https://www.php.net/
MySQL — https://www.mysql.com/
Ubuntu Server — https://ubuntu.com/download/server
Certbot — https://certbot.eff.org/
Let’s Encrypt — https://letsencrypt.org/

ВВЕРХ